#include <iostream>
#include <sstream>
#include <string>
#include <jsoncpp/json/json.h>

std::string Serialize()
{
    // 1、将所需要序列化的数据，存储在Json::Value对象中
    Json::Value root;
    root["姓名"] = "唐晨";
    root["年龄"] = 21;
    root["成绩"].append(78.9);
    root["成绩"].append(80.3);
    root["成绩"].append(90.7);
    // 2、实例化一个StreamWriterBuilder工厂类对象
    Json::StreamWriterBuilder swb;
    // 3、利用工厂类创建一个 StreamWriter类对象
    Json::StreamWriter *sw = swb.newStreamWriter();
    // 4、使用 StreamWriter类对象完成Json::Value的序列化过程
    std::stringstream ss;
    int ret = sw->write(root, &ss); // 总是返回0
    if (ret != 0)
    {
        std::cerr << "Serialize fail!" << std::endl;
        return "";
    }

    std::cout << "序列化的结果: \n"
              << ss.str() << std::endl;
    delete sw;
    return ss.str(); // str的作用就是stringstream类对象转化为string类
}

void deSerialize(const std::string &str)
{
    // 1、实例化一个CharReaderBuilder工厂类对象
    Json::CharReaderBuilder crb;
    // 2、利用CharReaderBuilder工厂类对象实例化一个CharReader对象
    Json::CharReader *cr = crb.newCharReader();
    // 3、定义一个Json::Value对象存储解析后的值
    Json::Value root;
    std::string err;
    // 4、利用CharReader对象实现str的反序列化
    // parse(char* begin,char* end,Json::Value对象,err错误码)
    bool flag = cr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);
    if (flag == false)
    {
        std::cerr << "deSerialize fail!" << std::endl;
        return;
    }
    // 5、逐个去访问Json::Value中的每个数据
    std::cout << "姓名: " << root["姓名"].asString() << std::endl;
    std::cout << "年龄: " << root["年龄"].asInt() << std::endl;
    int n = root["成绩"].size();
    for (int i = 0; i < n; i++)
    {
        std::cout << "成绩: " << root["成绩"][i].asFloat() << std::endl;
    }

    delete cr;
}

int main()
{
    std::string str = Serialize();
    std::cout << std::endl;
    deSerialize(str);
    return 0;
}